//
//  CYNetworkTools.swift
//  Swift访问网络
//
//  Created by CY on 16/3/3.
//  Copyright © 2016年 CY. All rights reserved.
//

import UIKit
import AFNetworking

/// 请求方式
///
/// - GET:  get
/// - POST: post
enum CYRequestMethod: String {
    case GET = "GET"
    case POST = "POST"
}

class CYNetworkTools: AFHTTPSessionManager {
    
    /// 定义返回值的类型
    typealias CYRequestCallback = (responseObject: [String: AnyObject]?, error: NSError?)->()
    
    // 单例
    static let sharedTools: CYNetworkTools = {
        let tools = CYNetworkTools()
        tools.responseSerializer.acceptableContentTypes?.insert("text/html")
        tools.responseSerializer.acceptableContentTypes?.insert("text/plain")
        return tools
    }()
    
    // 提供请求数据的方法
    
    /// 请求数据的方法
    ///
    /// - parameter method:     请求方式
    /// - parameter urlString:  请求地址
    /// - parameter parameters: 请求参数
    /// - parameter callback:   请求完成之后的闭包回调
    func requst(method: CYRequestMethod, urlString: String, parameters: AnyObject?, callback: CYRequestCallback) {
        
        
        // 拦截参数,往里面添加基础参数
        
        // 请求成功要执行的闭包
        let success = { (dataTask: NSURLSessionDataTask, responseObject: AnyObject?) in
            
            // 判断返回数据是否是一个字典
            guard let responseDict = responseObject as? [String: AnyObject] else {
                // 如果发现不是字典
                callback(responseObject: nil, error: NSError(domain: "com.itheima.hahaha", code: 10001, userInfo: ["message": "返回数据不是字典"]))
                return
            }
            // 回调数据
            callback(responseObject: responseDict, error: nil)
        }
        
        // 请求失败要执行的闭包
        let failure = { (dataTask: NSURLSessionDataTask?, error: NSError) in
            callback(responseObject: nil, error: error)
        }
        
        // 根据请求类型去调用不同的方法
        if method == .GET {
            self.GET(urlString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else {
            self.POST(urlString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
